泛型可以作为集合的补充,因为JDK1.5增加泛型很大程度上是为了让集合能记住其元素的数据类型。在没有泛型之前,一旦把一个对象“丢进”java集合中,集合就会忘记对象的类型,把所有对象都当做Object类型处理(编译时当做Object类型处理,运行时类型不变),而当程序从集合中取出对象后,就需要进行强制类型转换,这种强制类型转换使代码臃肿,而且容易引起ClassCastException异常。
str.forEach(str -> System.out.println((String)str.length());
使用泛型(Generic)
参数化类型(parameterized type)即泛型。如List
方法:在集合接口、类后增加尖括号,尖括号里放一个数据类型,即表明这个集合接口、集合类只能保存特定类型的对象。
Java7之后允许在构造器后不需要带完整的泛型信息。
1 | //定义Apple类时使用了泛型声明 |
上面使用Apple
从泛型类派生子类
当创建了带泛型声明的接口,可以为该泛型创建实现类;创建了父类,可以为该父类派生子类。当使用这些接口、父类时,不能再包含类型参数。
若想从Apple类派生一个子类:
1 | public class B extends Apple<String> |
也可不为类型参数传入实际的类型参数:
1 | public class B extend Apple |
如果Apple
1 | public class A1 extends Apple<String>{ |
并不存在泛型类
1 | List<String> l1 = new ArrayList<>(); |
不管泛型的实际类型参数是什么,它们运行时总有相同的类(class)。不管为泛型的类型形参传入哪一种类型实参,对于java来说,它们依然被当成同一个类处理。在内存中也只占用一块内存空间,因此在(static)静态方法、静态初始化块、静态变量声明和初始化时,不能使用类型形参。
由于系统中并不会生成真正的泛型类,所以instanceof运算符后不能使用泛型类。
类型通配符?
设定类型统配符?的上限
extends A>,把泛型对象作为方法参数传入方法的时候1 | //定义一个抽象类Shape |
1 | public class Apple<T extends Number>{ |
1 | 修饰符 <T, S> 返回值类型 方法名(形参列表){ |
1 | public interface Colletion<E>{ |
1 | public interface Colletion<E>{ |
1 | public class MyUtils{ |
[] lsa = new ArrayList<?>[10];
集合
List